package collection;

import org.junit.Test;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
 * @description:TreeSet的例子
 * @author: apple
 * @date:  2021/12/21 11:42 下午
 * @version 1.0
 **/
public class TreeSetTest {

    /*
  |----Set接口：存储无序的，不可重复的数据
                   |----HashSet、线程不安全，可以存储null  (内存也是也是无序的)
                   		|----LinkedHashSet、遍历数据时，按照添加的顺序遍历   (内存也是无序的，只不过添加了一个链表，在遍历的时候维护了添加的顺序)
                   |----TreeSet、可以按照对象属性排序,走的是排序方法，而不是equals方法
                                 1、只能添加同类对象
 */

    @Test
    public void test1() {

        TreeSet treeSet = new TreeSet();
        treeSet.add(4);
        treeSet.add(12);
        treeSet.add(1);
        treeSet.add(100);
        treeSet.add(71);
        treeSet.add(-71);

        Iterator iterator = treeSet.iterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

    @Test
    public void test2() {

        TreeSet treeSet = new TreeSet();
        // 如果此字符串对象按字典顺序位于参数字符串之前，则结果为负整数。
        // 如果此字符串对象按字典顺序跟随参数字符串，则结果为正整数。
        // 如果字符串相等，则结果为零；
        treeSet.add(new Student("b",22));
        treeSet.add(new Student("a",20));
        treeSet.add(new Student("z",20));


        Iterator iterator = treeSet.iterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

    @Test
    public void test3() {

        // 定制排序。compare
        TreeSet treeSet = new TreeSet(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return Integer.compare(o1.getAge(),o2.getAge());
            }
        });

        treeSet.add(new Student("b",22));
        treeSet.add(new Student("a",20));

        Iterator iterator = treeSet.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

class Student implements Comparable<Student> {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 自然排序。compareTo
    @Override
    public int compareTo(Student o) {

        // 姓名从小打到排序
        int i = name.compareTo(o.name);
        System.out.println(i);
        return i;

        // 年龄从小到大
//        return Integer.compare(age, o.age);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
